class B1
{
    public void f1() { System.out.println("B1:f1 "); }
}
class D1 extends B1
{
    public void f1() { System.out.println("D1:f1 "); }
}
class D2 extends D1
{
    public void f1() { System.out.println("D2:f1 "); }
}
class B2
{
    public void f2(B1 b) { System.out.print("B2:f2(B1) "); b.f1(); }
    public void f2(D1 d) { System.out.print("B2:f2(D1) "); d.f1(); }
    public void f2(D2 d) { System.out.print("B2:f2(D2) "); d.f1(); }
}
class D21 extends B2
{
    public void f2(B1 b) { System.out.print("D21:f2(B1) "); b.f1(); }
    public void f2(D1 d) { System.out.print("D21:f2(D1) "); d.f1(); }
    public void f2(D2 d) { System.out.print("D21:f2(D2) "); d.f1(); }
}

class Question
{
    public static void main(String [] args)
    {
	B2 b2b2 = new B2();
	B2 b2d21 = new D21();

	B1 b1b1 = new B1();
	B1 b1d1 = new D1();
	B1 b1d2 = new D2();
	D1 d1d1 = new D1();
	D1 d1d2 = new D2();
	D2 d2d2 = new D2();

	b2b2.f2(b1b1);
	b2b2.f2(b1d1);
	b2b2.f2(b1d2);
	b2b2.f2(d1d2);
	b2b2.f2(d2d2);

	b2d21.f2(b1b1);
	b2d21.f2(b1d1);
	b2d21.f2(b1d2);
	b2d21.f2(b1d1);
	b2d21.f2(d1d2);
	b2d21.f2(d2d2);

    }
}

/*
  output
  B2:f2(B1) B1:f1 
  B2:f2(B1) D1:f1 
  B2:f2(B1) D2:f1 
  B2:f2(B1) D1:f1 
  B2:f2(D1) D2:f1 
  B2:f2(D2) D2:f1 
  D21:f2(B1) B1:f1 
  D21:f2(B1) D1:f1 
  D21:f2(B1) D2:f1 
  D21:f2(B1) D1:f1 
  D21:f2(D1) D2:f1 
  D21:f2(D2) D2:f1 
*/